/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import br.ufrn.dca.controle.QuanserClient;
import br.ufrn.dca.controle.QuanserClientException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author Lindemberg
 */
public class Controlador {
    private String log, servidor, dataString;
    private QuanserClient cliente;
    private int porta, entradaAnalogica;
    private DateFormat dateFormat;
    private Date date;
    private boolean[] saidasAnalogicas;
    private Malha malha;
    
    // Variáveis de controle
    private Sinal sinal;
    private double pv, sp, erro, amplitude;
    
    
    public Controlador(){
        servidor = "localhost"; // IP: 10.13.96.69
        porta = 20081; // 20081 ou 20082
        
        saidasAnalogicas = new boolean[8];
        entradaAnalogica = 0;
        
        // Por Default, a malha selecionada é aberta
        malha = Malha.ABERTA;
        
        // Formato da data e hora do log.
        dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        date = new Date();
        dataString = dateFormat.format(date);
        
        log = (dataString + " -- Programa Iniciado!\n");
        System.out.println(log);
    }
    
    // Função para conectar com o servidor
    public void Conectar(String servidor){
        this.servidor = servidor;
        try {
            cliente = new QuanserClient(this.servidor, porta);
            setLog("Conexão com o servidor " + this.servidor + " foi bem sucedida!");
        } catch (QuanserClientException ex) {
             setLog("Erro na conexão com o servidor " + this.servidor + "!");
        }
    }
    
    public void setLog(String addLog){
        atualizarHora();
        this.log = log.concat(dataString + " -- " + addLog + "\n");
    }
    
    public void setLogInteiro(String addLog){
        this.log = addLog;
    }
    
    public String getLog(){
        return this.log;
    }
    
    private void atualizarHora(){
        date = new Date();
        dataString = dateFormat.format(date);
    }

    public boolean getSaida(int saida){
        return saidasAnalogicas[saida];
    }
    
    public void setSaida(int saida, boolean selected){
        saidasAnalogicas[saida] = selected;
        if(selected){
            setLog("Saída analógica " + saida + " selecionada!");
        }else{
            setLog("Saída analógica " + saida + " deselecionada!");
        }
    }
    
    public int getEntrada(){
        return entradaAnalogica;
    }
    
    public void setEntrada(int entradaAnalogica){
        this.entradaAnalogica = entradaAnalogica;
        setLog("Entrada analógica " + entradaAnalogica + " selecionada!");
    }
    
    public void setPorta(int porta){
        this.porta = porta;
        setLog("Porta " + porta + " selecionada!");
    }
    
    public int getPorta(){
        return this.porta;
    }

    /**
     * @return the malhaAberta
     */
    public Malha getMalha() {
        return malha;
    }

    /**
     * @param malhaAberta the malhaAberta to set
     */
    public void setMalha(Malha malha) {
        this.malha = malha;
        if(malha == Malha.ABERTA){
            setLog("Malha Aberta Selecionada!");
        }else{
            setLog("Malha Fechada Selecionada!");
        }
        
    }

    public void setServidor(String servidor) {
        this.servidor = servidor;
        setLog("Servidor " + servidor + " Selecionado");
    }

    public void setSetPoint(double sp) {
        if(sp >= 0 && sp < 30){
            this.sp = sp;
            setLog("Set-Point: " + sp);
        }else{
            setLog("Erro: Valor do Set-Point fora dos limites!");
        }
    }

    public void setSinal(Sinal sinal) {
        this.sinal = sinal;
        setLog("Sinal selecionado: " + sinal.toString());
    }

    /**
     * @return the amplitude
     */
    public double getAmplitude() {
        return amplitude;
    }

    /**
     * @param amplitude the amplitude to set
     */
    public void setAmplitude(double amplitude) {
        if(amplitude>0 && amplitude <=3){
            this.amplitude = amplitude;
            setLog("Amplitude " + amplitude + " Selecionada.");
        }else{
            setLog("Valor da amplitude fora dos limites (0 - 3V)!");
        }
        
    }

}